package ru.chaykin.quadtree;

import ru.chaykin.primitives.Circle;

/**
 * Квадрат подпространства для QuadTree
 * @author k.chaykin
 */
public class Quad {
	private float left;
	private float right;
	private float top;
	private float bottom;
	
	public Quad(float left, float right, float top, float bottom) {
		this.left = left;
		this.right = right;
		this.top = top;
		this.bottom = bottom;
	}
	
	/**
	 * Возвращает <code>true</code>, переданная в параметре метода окружность хотя бы частично лежит в данном квадрате. 
	 * В противном случае возвращает <code>false</code> 
	 */
	boolean in(Circle circle) {
		// Ищем пересечение проекций. Есть проблема, когда окружность на угле, но пофиг
		return ((circle.get_x() - circle.get_r() >= left && circle.get_x() - circle.get_r() <= right) || 
				(circle.get_x() - circle.get_r() < left && circle.get_x() + circle.get_r() > right) ||
			    (circle.get_x() + circle.get_r() >= left && circle.get_x() + circle.get_r() <= right)) &&
			   ((circle.get_y() - circle.get_r() >= bottom && circle.get_y() - circle.get_r() <= top) ||
			    (circle.get_y() - circle.get_r() < bottom && circle.get_y() + circle.get_r() > top) ||
			    (circle.get_y() + circle.get_r() >= bottom && circle.get_y() + circle.get_r() <= top));
		
	/*	if (circle.get_x() >= left && circle.get_x() <= right && circle.get_y() >= bottom && circle.get_y() <= top)
			return true;
		float lbDist = Point.distance(left, bottom, circle.get_x(), circle.get_y());
		if (lbDist <= circle.get_r())
			return true;
		float ltDist = Point.distance(left, top, circle.get_x(), circle.get_y());
		if (ltDist <= circle.get_r())
			return true;
		float rtDist = Point.distance(right, top, circle.get_x(), circle.get_y());
		if (rtDist <= circle.get_r())
			return true;
		float rbDist = Point.distance(right, bottom, circle.get_x(), circle.get_y());
		if (rbDist <= circle.get_r())
			return true;
		float dx = right - left;
		float dy = bottom - top;
		float dist = (float) ((dy * circle.get_x() + dx * circle.get_y() + (left * top - right * bottom)) / 
						Math.sqrt(dx * dx) + dy * dy);
		if (dist <)
		return false;*/
	}
	
	float getLeft() {
		return left;
	}
	
	float getRight() {
		return right;
	}
	
	float getTop() {
		return top;
	}
	
	float getBottom() {
		return bottom;
	}
}
